﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using TumbaloSoft.Models;
using System.Collections;
using TumbaloSoft.Helpers;
using TumbaloSoft.Helpers.QueryObjects;

namespace TumbaloSoft.Controllers
{
    public class ProveedorController : TumbaloController
    {
        private static Object lockObject = new Object();
        
        public ActionResult Index(BusquedaProveedor proveedorBuscar, string tipo)
        {
            if (defaultAction != null) return defaultAction;
            try
            {
                IList proveedores;
                IList proveedores2;

                List<Proveedor> provFinal = new List<Proveedor>();

                if (tipo == "2")
                {
                    Boolean natural = false;
                    Boolean juridico = true;

                    if (proveedorBuscar.prRazonSocial ==null || proveedorBuscar.prRazonSocial == "") juridico=false;

                    if (proveedorBuscar.prApellidoMaterno != null && proveedorBuscar.prApellidoMaterno != "") natural = true;
                    if (proveedorBuscar.prApellidoPaterno != null && proveedorBuscar.prApellidoPaterno != "") natural = true;
                    if (proveedorBuscar.prNombre != null && proveedorBuscar.prNombre != "") natural = true;
                    if (proveedorBuscar.prSexo == "M" || proveedorBuscar.prSexo == "F") natural = true;

                    if (natural && juridico) tipo = "2";
                    else
                    {
                        if (natural) tipo = "0";
                        if (juridico) tipo = "1";
                    }

                }

                if (tipo == "0")
                { //Natural

                    proveedores = HelperProveedor.buscarProveedorNatural(proveedorBuscar);

                    if (proveedores != null)
                    {
                        for (int i = 0; i < proveedores.Count; i++)
                        {
                            Proveedor prov = new Proveedor();
                            prov.prProveedorNatural = HelperPersonaNatural.selectById(((Proveedor)(proveedores[i])).prIdPersona);
                            prov.prDescripcion = ((Proveedor)(proveedores[i])).prDescripcion;
                            if (prov.prDescripcion == null) prov.prDescripcion = "-------";
                            if (prov.prProveedorNatural.prNombre != null)
                            {
                                prov.prIdProveedor = ((Proveedor)(proveedores[i])).prIdProveedor;
                                prov.prTipoEspecial = 0;
                                provFinal.Add(prov);
                            }

                        }
                    }

                }

                if (tipo == "1")
                {
                    //Juridico
                    proveedores = HelperProveedor.buscarProveedorJuridico(proveedorBuscar);

                    if (proveedores != null)
                    {

                        for (int i = 0; i < proveedores.Count; i++)
                        {
                            Proveedor prov = new Proveedor();
                            prov.prProveedorJuridico = HelperPersonaJuridica.selectById(((Proveedor)(proveedores[i])).prIdPersona);
                            prov.prDescripcion = ((Proveedor)(proveedores[i])).prDescripcion;
                            if (prov.prDescripcion == null) prov.prDescripcion = "-------";
                            if (prov.prProveedorJuridico.prRazonSocial != null)
                            {
                                prov.prIdProveedor = ((Proveedor)(proveedores[i])).prIdProveedor;
                                prov.prTipoEspecial = 1;
                                provFinal.Add(prov);
                            }
                        }
                    }

                }

                if (tipo == null)
                {
                    //Primera Vez
                    proveedores = HelperProveedor.selectAllActivo();
                    if (proveedores != null)
                    {
                        for (int i = 0; i < proveedores.Count; i++)
                        {
                            Proveedor prov = new Proveedor();
                            prov.prProveedorNatural = HelperPersonaNatural.selectById(((Proveedor)(proveedores[i])).prIdPersona);
                            prov.prDescripcion = ((Proveedor)(proveedores[i])).prDescripcion;
                            if (prov.prDescripcion == null) prov.prDescripcion = "-------";
                            if (prov.prProveedorNatural.prNombre != null)
                            {
                                prov.prIdProveedor = ((Proveedor)(proveedores[i])).prIdProveedor;
                                prov.prTipoEspecial = 0;
                                provFinal.Add(prov);
                            }
                        }

                        for (int i = 0; i < proveedores.Count; i++)
                        {
                            Proveedor prov = new Proveedor();
                            prov.prProveedorJuridico = HelperPersonaJuridica.selectById(((Proveedor)(proveedores[i])).prIdPersona);
                            prov.prDescripcion = ((Proveedor)(proveedores[i])).prDescripcion;
                            if (prov.prDescripcion == null) prov.prDescripcion = "-------";
                            if (prov.prProveedorJuridico.prRazonSocial != null)
                            {
                                prov.prIdProveedor = ((Proveedor)(proveedores[i])).prIdProveedor;
                                prov.prTipoEspecial = 1;
                                provFinal.Add(prov);
                            }
                        }
                    }

                }

                if (tipo == "2")
                {
                    //Con Busqueda no especifica
                    proveedores = HelperProveedor.buscarProveedorNatural(proveedorBuscar);
                    proveedores2 = HelperProveedor.buscarProveedorJuridico(proveedorBuscar);
                    if (proveedores != null)
                    {
                        for (int i = 0; i < proveedores.Count; i++)
                        {
                            Proveedor prov = new Proveedor();
                            prov.prProveedorNatural = HelperPersonaNatural.selectById(((Proveedor)(proveedores[i])).prIdPersona);
                            if (prov.prProveedorNatural.prNombre != null)
                            {
                                prov.prIdProveedor = ((Proveedor)(proveedores[i])).prIdProveedor;
                                prov.prTipoEspecial = 0;
                                provFinal.Add(prov);
                            }
                        }
                    }

                    if (proveedores2 != null)
                    {
                        for (int i = 0; i < proveedores2.Count; i++)
                        {
                            Proveedor prov = new Proveedor();
                            prov.prProveedorJuridico = HelperPersonaJuridica.selectById(((Proveedor)(proveedores2[i])).prIdPersona);
                            prov.prDescripcion = ((Proveedor)(proveedores2[i])).prDescripcion;
                            if (prov.prDescripcion == null) prov.prDescripcion = "-------";
                            if (prov.prProveedorJuridico.prRazonSocial != null)
                            {
                                prov.prIdProveedor = ((Proveedor)(proveedores2[i])).prIdProveedor;
                                prov.prTipoEspecial = 1;
                                provFinal.Add(prov);
                            }
                        }
                    }

                }


                ViewBag.ListaProveedor = provFinal;
                ViewBag.tipo = tipo;
                int numActivos = (HelperProveedor.selectAllActivo()).Count;
                //if (provFinal != null) numActivos = provFinal.Count;
                ViewBag.prevPage = proveedorBuscar.prPage - 1;
                ViewBag.nextPage = proveedorBuscar.prPage + 1;
                ViewBag.numPages = numActivos / proveedorBuscar.prPageSize;
                if ((numActivos % proveedorBuscar.prPageSize) > 0) ViewBag.numPages++;        

            }
           catch(Exception ex)
            {
                Logger.Current.Error("Ocurrio un error en proveedor", ex);
                return View("~/Views/Shared/Error.cshtml");

            }

            return View(proveedorBuscar);
        }
        

        public ActionResult Registrar()
        {
            if (defaultAction != null) return defaultAction;

            try
            {
                IList tipodocumento = HelperTipoDocumento.selectAll();
                ViewBag.tipodoc = tipodocumento;
                ViewBag.tipo = "0";
            }
            catch(Exception ex)
            {
                Logger.Current.Error("Ocurrio un error al cargar los tipos de documento", ex);
                return View("~/Views/Shared/Error.cshtml");
            }
            return View();
        }



        [HttpPost]
        public ActionResult Registrar(Proveedor proveedor, string Tipo)
        {
            if (defaultAction != null) return defaultAction;

            try
            {
                IList tipodocumento = HelperTipoDocumento.selectAll();
                ViewBag.tipodoc = tipodocumento;
                ViewBag.tipo = Tipo;                
                
            }
            catch(Exception ex)
            {
                Logger.Current.Error("Ocurrio un error al cargar los tipos de documento", ex);
                return View("~/Views/Shared/Error.cshtml");
            }            

            if (Tipo == "0")//Se hace lo de persona natural
            {
                ModelState.Remove("prProveedorJuridico.prRazonSocial");
                ModelState.Remove("prProveedorNatural.prDireccion");
                ModelState.Remove("prProveedorNatural.prEmail");
                ModelState.Remove("prProveedorNatural.prTelefono");
                ModelState.Remove("prProveedorNatural.prRuc");
                ModelState.Remove("prProveedorJuridico.prDireccion");
                ModelState.Remove("prProveedorJuridico.prEmail");
                ModelState.Remove("prProveedorJuridico.prTelefono");
                ModelState.Remove("prProveedorJuridico.prRuc");


                if (proveedor.prDescripcion == "" || proveedor.prDescripcion == null)
                {
                    ModelState.AddModelError("prDescripcion", "El campo Servicio es obligatorio");

                }

                if (proveedor.prRuc == "" || proveedor.prRuc == null)
                {
                    ModelState.AddModelError("prRuc","El campo Ruc es obligatorio");

                }

                if (proveedor.prRuc != null && proveedor.prRuc.Length > 11)
                {
                    ModelState.AddModelError("prRuc", "El campo Ruc debe ser de 11 digitos");
                }

                DateTime fecha=DateTime.Today;

                if (proveedor.prProveedorNatural.prFechaNacimiento != null && proveedor.prProveedorNatural.prFechaNacimiento.CompareTo(fecha)>0)
                {
                    ModelState.AddModelError("prProveedorNatural.prFechaNacimiento", "El campo Fecha de nacimiento debe ser una fecha pasada");
                }

                if (ModelState.IsValid)
                {
                    try
                    {

                        proveedor.prIdPersona = HelperPersonaNatural.SiguienteCodigo();
                        HelperProveedor.insertNatural(proveedor);

                        proveedor.prIdProveedor = HelperProveedor.selectMaxCodigo() + 1;
                        HelperProveedor.insert(proveedor);
                    }
                    catch(Exception ex)
                    {
                        Logger.Current.Error("Ocurrio un error al insertar el proveedor", ex);
                        return View("~/Views/Shared/Error.cshtml");
                    }
                }
                else return View(proveedor);                

            }

            if (Tipo == "1")
            {
                ModelState.Remove("prProveedorNatural.prSexo");
                ModelState.Remove("prProveedorNatural.prCodigoDocumento");
                ModelState.Remove("prProveedorNatural.prNombre");
                ModelState.Remove("prProveedorNatural.prApellidoPaterno");
                ModelState.Remove("prProveedorNatural.prApellidoMaterno");
                ModelState.Remove("prProveedorNatural.prFechaNacimiento");
                ModelState.Remove("prProveedorNatural.prDireccion");
                ModelState.Remove("prProveedorNatural.prEmail");
                ModelState.Remove("prProveedorNatural.prTelefono");
                ModelState.Remove("prProveedorNatural.prTipoDocumento");
                ModelState.Remove("prProveedorNatural.prRuc");
                ModelState.Remove("prProveedorJuridico.prDireccion");
                ModelState.Remove("prProveedorJuridico.prEmail");
                ModelState.Remove("prProveedorJuridico.prTelefono");
                ModelState.Remove("prProveedorJuridico.prRuc");

                if (proveedor.prDescripcion == "" || proveedor.prDescripcion == null)
                {
                    ModelState.AddModelError("prDescripcion", "El campo Servicio es obligatorio");

                }

                if (proveedor.prRuc == "" || proveedor.prRuc == null)
                {
                    ModelState.AddModelError("prRuc", "El campo Ruc es obligatorio");

                }

                if (proveedor.prRuc != null && proveedor.prRuc.Length > 11)
                {
                    ModelState.AddModelError("prRuc", "El campo Ruc debe ser de 11 digitos");
                }


                if (ModelState.IsValid)
                {
                    try
                    {
                    
                        proveedor.prIdPersona = HelperPersonaJuridica.SiguienteCodigo();
                        HelperProveedor.insertJuridica(proveedor);

                        proveedor.prIdProveedor = HelperProveedor.selectMaxCodigo() + 1;
                        HelperProveedor.insert(proveedor);
                    }
                    catch(Exception ex)
                    {
                        Logger.Current.Error("Ocurrio un error al insertar un proveedor", ex);
                        return View("~/Views/Shared/Error.cshtml");
                    }
                }
                else return View(proveedor);

             }

            ViewBag.mensaje = "Se creo correctamente el nuevo Proveedor ";
            ViewBag.returnURL="/Proveedor/";
            return View("~/Views/Shared/Exito.cshtml");
         }




        public ActionResult Eliminar(int? id, int tipo)
        {
            if (defaultAction != null) return defaultAction;

            try
            {
                Proveedor proveedor=null;

                if (id.HasValue) proveedor = HelperProveedor.selectById(id.Value);
                else { return View("~/Views/Shared/Error.cshtml"); }

                if (tipo == 0)
                {

                    proveedor.prProveedorNatural = HelperPersonaNatural.selectById(proveedor.prIdPersona);
                    proveedor.prProveedorNatural = HelperPersonaNatural.selectById(proveedor.prIdPersona);

                    proveedor.prProveedorNatural.prTipoDocumento = HelperTipoDocumento.selectById(proveedor.prProveedorNatural.prTipoDocumento.prIdTipoDocumento);
                }

                if (tipo == 1)
                {
                    proveedor.prProveedorJuridico = HelperPersonaJuridica.selectById(proveedor.prIdPersona);
                }

                if (tipo == 0) ViewBag.fechaNacimiento = proveedor.prProveedorNatural.prFechaNacimiento.ToString();             
                ViewBag.tipo = tipo;
                return View(proveedor);
            }
            catch(Exception ex)
            {
                Logger.Current.Error("Ocurrio un error al cargar un proveedor", ex);
                return View("~/Views/Shared/Error.cshtml");
            }

        }




        [HttpPost]
        public ActionResult Eliminar(Proveedor proveedor, int tipo)
        {
            if (defaultAction != null) return defaultAction;

            try
            {

                if (tipo == 0)
                {

                    ModelState.Remove("prProveedorJuridico.prRazonSocial");
                    ModelState.Remove("prProveedorNatural.prDireccion");
                    ModelState.Remove("prProveedorNatural.prEmail");
                    ModelState.Remove("prProveedorNatural.prTelefono");
                    ModelState.Remove("prProveedorNatural.prRuc");
                    ModelState.Remove("prProveedorJuridico.prDireccion");
                    ModelState.Remove("prProveedorJuridico.prEmail");
                    ModelState.Remove("prProveedorJuridico.prTelefono");
                    ModelState.Remove("prProveedorJuridico.prRuc");
                }

                if (tipo == 1)
                {
                    proveedor.prProveedorJuridico = HelperPersonaJuridica.selectById(proveedor.prIdPersona);
                    ModelState.Remove("prProveedorNatural.prSexo");
                    ModelState.Remove("prProveedorNatural.prCodigoDocumento");
                    ModelState.Remove("prProveedorNatural.prNombre");
                    ModelState.Remove("prProveedorNatural.prApellidoPaterno");
                    ModelState.Remove("prProveedorNatural.prApellidoMaterno");
                    ModelState.Remove("prProveedorNatural.prFechaNacimiento");
                    ModelState.Remove("prProveedorNatural.prDireccion");
                    ModelState.Remove("prProveedorNatural.prEmail");
                    ModelState.Remove("prProveedorNatural.prTelefono");
                    ModelState.Remove("prProveedorNatural.prTipoDocumento");
                    ModelState.Remove("prProveedorNatural.prRuc");
                    ModelState.Remove("prProveedorJuridico.prDireccion");
                    ModelState.Remove("prProveedorJuridico.prEmail");
                    ModelState.Remove("prProveedorJuridico.prTelefono");
                    ModelState.Remove("prProveedorJuridico.prRuc");
                }

                
                if (ModelState.IsValid)
                {
                    //HelperContratoMantenimiento.delete(contrato);
                    //Edificio edif = HelperEdificio.selectById(contrato.prEdificio.prIdEdificio);

                    HelperProveedor.deleteProveedor(proveedor);
                    
                    ViewBag.mensaje = "Se elimino correctamente el nuevo Proveedor ";                    
                    ViewBag.returnURL = "/Proveedor/";
                    return View("~/Views/Shared/Exito.cshtml");
                }
                ViewBag.tipo = tipo;
                return View(proveedor);
            }
            catch(Exception ex)
            {
                Logger.Current.Error("Ocurrio un error al eliminar un proveedor", ex);
                return View("~/Views/Shared/Error.cshtml");
            }
        }
		






        //Modificar


        public ActionResult Modificar(int? id, int tipo)
        {

            if (defaultAction != null) return defaultAction;

            try
            {
                Proveedor proveedor = null;

                if (id.HasValue) proveedor = HelperProveedor.selectById(id.Value);
                else { return View("~/Views/Shared/Error.cshtml"); }

                if (tipo == 0)
                {

                    proveedor.prProveedorNatural = HelperPersonaNatural.selectById(proveedor.prIdPersona);
                    proveedor.prProveedorNatural = HelperPersonaNatural.selectById(proveedor.prIdPersona);

                    proveedor.prProveedorNatural.prTipoDocumento = HelperTipoDocumento.selectById(proveedor.prProveedorNatural.prTipoDocumento.prIdTipoDocumento);
                }

                if (tipo == 1)
                {
                    proveedor.prProveedorJuridico = HelperPersonaJuridica.selectById(proveedor.prIdPersona);
                }

                if (tipo == 0) ViewBag.fechaNacimiento = proveedor.prProveedorNatural.prFechaNacimiento.ToString();
                ViewBag.tipo = tipo;
                return View(proveedor);
            }
            catch(Exception ex)
            {
                Logger.Current.Error("Ocurrio un error al cargar un proveedor", ex);
                return View("~/Views/Shared/Error.cshtml");
            }

        }









        [HttpPost]
        public ActionResult Modificar(Proveedor proveedor, int tipo)
        {
            if (defaultAction != null) return defaultAction;

            try
            {

                if (tipo == 0)
                {
                    //Remover lo de Proveedor
                    ModelState.Remove("prProveedorJuridico.prRazonSocial");                   
                    ModelState.Remove("prProveedorJuridico.prDireccion");
                    ModelState.Remove("prProveedorJuridico.prEmail");
                    ModelState.Remove("prProveedorJuridico.prTelefono");
                    ModelState.Remove("prProveedorJuridico.prRuc");
             
                }

                if (tipo == 1)
                {                    
                    ModelState.Remove("prProveedorNatural.prSexo");
                    ModelState.Remove("prProveedorNatural.prCodigoDocumento");
                    ModelState.Remove("prProveedorNatural.prNombre");
                    ModelState.Remove("prProveedorNatural.prApellidoPaterno");
                    ModelState.Remove("prProveedorNatural.prApellidoMaterno");
                    ModelState.Remove("prProveedorNatural.prFechaNacimiento");
                    ModelState.Remove("prProveedorNatural.prDireccion");
                    ModelState.Remove("prProveedorNatural.prEmail");
                    ModelState.Remove("prProveedorNatural.prTelefono");
                    ModelState.Remove("prProveedorNatural.prTipoDocumento");
                    ModelState.Remove("prProveedorNatural.prRuc");

                }
                
                if (proveedor.prDescripcion == "" || proveedor.prDescripcion == null)
                {
                    ModelState.AddModelError("prDescripcion", "El campo Servicio es obligatorio");

                }


                if (ModelState.IsValid)
                {
                    //HelperContratoMantenimiento.delete(contrato);
                    //Edificio edif = HelperEdificio.selectById(contrato.prEdificio.prIdEdificio);

                    //HelperProveedor.deleteProveedor(proveedor);
                    HelperProveedor.updateProveedor(proveedor);
                    
                    if (tipo == 0)
                    {
                        HelperPersonaNatural.update(proveedor.prProveedorNatural);
                    }

                    if (tipo == 1)
                    {
                        HelperPersonaJuridica.update(proveedor.prProveedorJuridico);
                    }


                    ViewBag.mensaje = "Se modifico correctamente el nuevo Proveedor ";
                    ViewBag.returnURL = "/Proveedor/";
                    return View("~/Views/Shared/Exito.cshtml");
                }
                ViewBag.tipo = tipo;
                return View(proveedor);
            }
            catch(Exception ex)
            {
                Logger.Current.Error("Ocurrio un error al modificar un proveedor", ex);
                return View("~/Views/Shared/Error.cshtml");
            }
        }

        
     }
}
